perm filename SPECS[P,JRA] blob
sn#429054 filedate 1979-04-01 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00002 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002
C00028 ENDMK
C⊗;
function syn
(1 1 1 0 0)
syn(speci, target, envinit, program, newenv) ←
firstsym(speci, nxtsym, spec),
int(nxtsym, spec, envinit, int-prog, newenv),
trans(int-prog, newenv, target, program).
function int
(1 1 1 0 0)
int('function, spec, oldenv, int-prog, newenv) ← fun-spec(spec, oldenv, int-prog, newenv)
int('type, spec, oldenv, int-prog, newenv) ← type-spec(spec, oldenv, int-prog, newenv)
int('generic, spec, oldenv, int-prog, newenv) ← gen-spec(spec, oldenv, int-prog, newenv).
function fun-spec
(1 1 0 0)
fun-spec(spec, oldenv, list('function, name, inpat, params, precond, postcond, body),
newenv) ←
firstsym(spec, name, more2),
write("input-pattern?"), firstexp(more2, inpat, more3),
write("parameter list?"), firstexp(more3, params, more4),
write("precondition?"), is-disjunct(more4, precond, more5),
write("postcondition?"), is-disjunct(more5, postcond, more6),
addfun(oldenv, name, newenv),
write("body?"), is-body(more6, body, moren, undef, newenv, inpat).
function is-disjunct
(1 0 0)
is-disjunct(spec, disj, more) ←
is-conjunct(spec, conj, more1, nxtsym),
finish-disj(more1, nxtsym, conj, disj, more).
function finish-disj
(1 1 1 0 0)
finish-disj(spec, '∨, conj, list('∨, conj, disj), more) ←
is-disjunct(spec, disj, more)
finish-disj(spec, '/., conj, conj, spec).
function is-conjunct
(1 0 0 0)
is-conjunct(spec, conj, more, nxtsym) ←
firstsym(spec, litsym, more1),
is-literal(litsym, more1, lit, more2, midsym),
finish-conj(more2, midsym, lit, conj, more, nxtsym).
function finish-conj
(1 1 1 0 0 0)
finish-conj(spec, '∧, lit, list('∧, lit, conj), more, nxtsym) ←
is-conjunct(spec, conj, more, nxtsym)
finish-conj(spec, '/., lit, lit, spec, '/.).
function is-literal
(1 1 0 0 0)
is-literal('TRUE, spec, T, more, nxtsym) ← firstsym(spec, nxtsym, more)
is-literal('T, spec, T, more, nxtsym) ← firstsym(spec, nxtsym, more)
is-literal('/(, spec, disj, more, nxtsym) ← is-disjunct(spec, disj, more1),
firstsym(more1, '/), more2), firstsym(more2, nxtsym, more)
is-literal(name, spec, atmf, more, nxtsym) ← firstsym(spec, '/(, more1),
is-funapp(name, more1, atmf, more, nxtsym).
function is-funapp
(1 1 0 0 0)
is-funapp(name, spec, cons(name, arglist), more, nxtsym) ←
is-arglist(spec, arglist, more, nxtsym).
function is-arglist
(1 0 0 0)
is-arglist(spec, arglist, more, nxtsym) ←
firstsym(spec, argsym, more2),
read-args(argsym, more2, arglist, more,nxtsym).
function read-args
(1 1 0 0 0)
read-args('/), spec, (), more, nxtsym) ← firstsym(spec, nxtsym, more)
read-args(argsym, spec, cons(arg,arglist), more, nxtsym) ←
is-arg(argsym, spec, arg, more1, midsym),
read-args(midsym, more1, arglist, more, nxtsym).
function is-arg
(1 1 0 0 0)
is-arg(argsym, spec, const, more, nxtsym) ← is-constnt(argsym, spec, const, more1),
firstsym(more1, nxtsym, more)
is-arg(name, spec, arg, more, lastsym) ← firstsym(spec, nxtsym, more1),
finish-arg(nxtsym, name, more1, arg, more, lastsym).
function finish-arg
(1 1 1 0 0 0)
finish-arg('/(, name, spec, fnapp, more, nxtsym) ←
is-funapp(name, spec, fnapp, more, nxtsym)
finish-arg(nxtsym, name, spec, name, spec, nxtsym).
function is-constnt
(1 1 0 0)
is-constnt('/', spec, list('quote,exp), more) ←
firstexp(spec, exp, more)
is-constnt(number, spec, number, more) ← integer(number)
is-constnt(number, spec, number, more) ← real(number)
is-constnt('undef, spec, undef, more)
is-constnt('false, spec, false, more)
is-constnt('true, spec, t, more)
is-constnt('t, spec, t, more)
is-constnt('/(, spec, (), more) ← firstsym(spec,'/),more).
function is-body
(1 0 0 1 1 1)
is-body(spec,cons('bktrkcond,alternatives),more,genflag,env,inpat) ←
firstsym(spec, sym, more1),
is-hornclauses(sym, more1,alternatives,more,genflag,env,inpat).
function is-hornclauses
(1 1 0 0 1 1 1)
is-hornclauses('/., spec,(),more,genflag,env,inpat)
is-hornclauses(name, spec, cons(match-try-pair,alternatives),
more,genflag,env,inpat) ←
firstsym(spec, '/(, spec2),
is-hclause(name,spec2,match-try-pair,more1,genflag,env,inpat,nxtsym),
is-hornclauses(nxtsym,more1,alternatives,more,genflag,env,inpat).
function is-hclause
(1 1 0 0 1 1 1 0)
is-hclause(name,spec,list(arglist,trylist),more,genflag,env,inpat,lastsym) ←
is-funapp(name,spec,cons(name,arglist),more1,nxtsym),
finish-hclause(nxtsym, name, arglist, inpat, genflag, env, more1,
trylist, lastsym).
function finish-hclause
(1 1 1 1 1 1 1 0 0 0)
finish-hclause('←, name, arglist, inpat, genflag, env, spec, trylist,
more, nxtsym) ←
mk-known(inpat, arglist, (), knownvars),
is-subgoalist(spec, trylist, more, env, knownvars, genflag, nxtsym)
finish-hclause(nxtsym, name, arglist, inpat, genflag, env, spec,
cons('try, ()), spec, nxtsym).
function is-subgoalist
(1 0 0 1 1 1 0)
is-subgoalist(spec,cons('try,cons(cons(fname,arglist),sbglist)),more,env,
knownvars,false,lastsym) ←
firstsym(spec,name,spec2), firstsym(spec2, '/(, spec3),
is-funapp(name,spec3,cons(name,arglist),more1,nxtsym),
ck-generic(name,env,arglist, knownvars,fname),
mk-allknown(arglist,knownvars,newknownvars),
rd-subgoals(nxtsym,more1,sbglist,more,env,newknownvars,false,lastsym)
is-subgoalist(spec,cons('try,cons(cons(name,arglist),sbglist)),more,env,
knownvars,true,lastsym) ←
firstsym(spec,name,spec2), firstsym(spec2, '/(, spec3),
is-funapp(name, spec3,cons(name,arglist),more1,nxtsym),
rd-subgoals(nxtsym,more1,sbglist,more,env,knownvars,true,lastsym).
function rd-subgoals
(1 1 0 0 1 1 1 0)
rd-subgoals('/,,spec,cons(cons(name,arglist),sbglist),
more,env,knownvars,true,lastsym) ←
firstsym(spec,name,more1), firstsym( more1, '/(, more12),
is-funapp(name,more12,cons(name,arglist),more2,nxtsym),
rd-subgoals(nxtsym,more2,sbglist,more,env,knownvars,true,lastsym)
rd-subgoals('/,,spec,cons(cons(fname,arglist),sbglist),
more,env,knownvars,false,lastsym) ←
firstsym(spec,name,more1), firstsym(more1, '/(, more21),
is-funapp(name,more21,cons(name,arglist),more2,nxtsym),
ck-generic(name,env,arglist,knownvars,fname),
mk-allknown(arglist,knownvars,newknownvars),
rd-subgoals(nxtsym,more2,sbglist,more,env,newknownvars,false,lastsym)
rd-subgoals(nxtsym, spec, (), spec, env, knownvars, genflag, nxtsym) .
function ck-generic
(1 1 1 1 0)
ck-generic(name, env, arglist, knownvars, name) ← generic(name, env, undef)
ck-generic(name, env, arglist, knownvars, fname) ←
generic(name, env, selections),
mk_pat(arglist, knownvars, inpat),
choose-fun(inpat, selections, fname).
function generic
(1 1 0)
generic(name,list(generics,functions, types), selections) ←
findin(name,generics,selections).
function findin
(1 1 0)
findin(name, (), 'undef)
findin(name, cons(cons(name,x),y), x)
findin(name, cons(cons(other,x),y), z) ← findin(name,y,z).
function addfun
(1 1 0)
addfun(list(generics,functions,types),name,
list(generics, cons(name,functions),types)).
function not-in
(1 1)
not-in(x,())
not-in(x,l) ← member(x,l,false).
function member
(1 1 0)
member(x,cons(x,l),true)
member(x,cons(y,l),ans) ← member(x,l,ans)
member(x,(),false).
function mk-allknown
(1 1 0)
mk-allknown((),knownvars,knownvars)
mk-allknown(cons(x,l), knownvars, newknownvars) ← vars_in(x,vl),
mk-allknown(l, knownvars, nkv), append$(vl, nkv, newknownvars).
function mk-known
(1 1 1 0)
mk-known((), (), knownvars, knownvars)
mk-known(cons(1,l), cons(x,k), knownvars, newknownvars) ← vars_in(x,vl),
mk-known(l,k,knownvars, nkv), append$(vl, nkv, newknownvars)
mk-known(cons(0,l), cons(x,k), knownvars, newknownvars) ←
mk-known(l, k, knownvars, newknownvars).
function vars_in
(1 0)
vars_in(exp,()) ← itsaconstant(exp,true)
vars_in(exp, cons(exp,())) ← itsavar(exp,true)
vars_in(cons(name,arglist), varlist) ← varsinlist(arglist, varlist).
function varsinlist
(1 0)
varsinlist((), ())
varsinlist(cons(s,l), varlist) ← vars_in(x, varlist1),
varsinlist(l, varlist2), append$(varlist1, varlist2, varlist).
function itsaconstant
(1 0)
itsaconstant(x, true) ← itsanumber(x, true)
itsaconstant(cons('quote,l), true)
itsaconstant(t, true)
itsaconstant('undef, true)
itsaconstant((), true)
itsaconstant('false, true)
itsaconstant('true, true)
itsaconstant('f, true)
itsaconstant(x, true) ← is-string(x).
function itsanumber
(1 0)
itsanumber(x,true) ← real(x)
itsanumber(x, true) ← integer(x).
function itsavar
(1 0)
itsavar(cons(x,y), false)
itsvar(exp, true) ← itsaconstant(exp, false).
function append$
(1 1 0)
append$(x,(),x)
append$( (), x, x)
append$(cons(x,l1), l2, cons(x,l3)) ← append$(l1, l2, l3).
function choose-fun
(1 1 0)
choose-fun(inpat, cons(pattern, cons(fname, sels)), fname) ←
enuf-known(inpat, pattern, true)
choose-fun(inpat, cons(pattern, cons(fname,sels)), funname) ←
choose-fun(inpat, sels, funname)
choose-fun(inpat, (), undef).
function enuf-known
(1 1 0)
enuf-known((), (), true)
enuf-known(cons(1,l), cons(x,k), ans) ← enuf-known(l,k,ans)
enuf-known(cons(0,l), cons(1,k), false).
function mk_pat
(1 1 0)
mk_pat( (), knownvars, ())
mk_pat(cons(arg,l), knownvars, cons(1,k)) ←
is-known(arg, knownvars, true), mk_pat(l, knownvars, k)
mk_pat(cons(arg,l), knownvars, cons(0,k)) ← mk_pat(l, knownvars, k).
function is-known
(1 1 0)
is-known(x, knownvars, true) ← itsaconstant(x,true)
is-known(cons(f,l), knownvars,ans) ← known-list(l, knownvars, ans)
is-known(x, knownvars, ans) ← member(x, knownvars, ans).
function knownlist
(1 1 0)
known-list((), knownvars, true)
known-list(cons(x,l), knownvars, true) ← is-known(x, knownvars, true),
known-list(l,knownvars,true).
function type-spec
(1 1 0 0)
type-spec(spec,oldenv,
list('type,name,'(1 0), '(x y), T, '(boolean y),body), newenv) ←
firstsym(spec, name, more1),
add-type(oldenv, name, newenv),
write("body?"),
is-body(more1, body, morex, undef, newenv, '(1 0)).
function add-type
(1 1 0)
add-type(list(generics,functions,types), name,
list(generics,functions, cons(name,types))).
function gen-spec
(1 1 0 0)
gen-spec(spec, oldenv,
cons(list('generic, name, params, selections), deflist), newenv) ←
firstsym(spec, name, more1),
write("parameter list?"), firstexp(more1, params, more2),
write("choices?"), firstsym(more2, nxtsym, more3),
rd-choices(nxtsym, more3, choicelist, bodylist, more4),
add-gen(oldenv, name, choicelist, newenv),
repeats-of(bodylist, rep-bodnams),
write("body-defs:"),
rd-bodies(more4, choicelist, (), (), params, rep-bodnams, newenv,
deflist, morex).
function rd-choices
(1 1 0 0 0)
rd-choices('/., spec, (), (), more)
rd-choices('/(, spec, cons(list(inpat,name,precond,postcond,bodnam), choicelist),
cons(bodnam,bodylist), more) ←
firstsym(spec, nxtsym, spec2),
readinpat(nxtsym, spec2, inpat, more1), write("function name?"),
firstsym(more1, name, more2), write("precondition?"),
is-disjunct(more2, precond, more3),
write("postcondition?"),
is-disjunct(more3, postcond, more4),
write("body name?"),
firstsym(more4, bodnam, more5),
write("choices?"), firstsym(more5, chsym, more6),
rd-choices(chsym, more6, choicelist, bodylist, more).
function readinpat
(1 1 0 0)
readinpat('/), spec, (), spec)
readinpat(digit, spec, cons(digit, restinpat), more) ←
firstsym(spec, nxtsym, more1),
readinpat(nxtsym, more1, restinpat, more).
function rd-bodies
(1 1 1 1 1 1 1 0 0)
rd-bodies(spec, (), rep-bodies, donelist, params, rep-bodnams, env, (), spec)
rd-bodies(spec, cons(list(inpat,name,precond,postcond,bodnam), choicelist),
rep-bodies, donelist, params, rep-bodnams,env,
cons(list('function,name,inpat,params,precond,postcond,body), deflist),
more) ←
not-in(bodnam, donelist), not-in(bodnam,rep-bodnams),
write(bodnam), write("?"),
is-body(spec, body, more1, false, env, inpat),
rd-bodies(more1, choicelist, rep-bodies, cons(bodnam,donelist), params,
rep-bodnams, env, deflist, more)
rd-bodies(spec, cons(list(inpat,name,precond,postcond,bodnam), choicelist),
rep-bodies, donelist, params, rep-bodnams,env,
cons(list('function,name,inpat,params,precond,postcond,body), deflist),
more) ←
member(bodnam,donelist,true),
getb(bodnam, rep-bodies, genbody),
spec-body(inpat, env, genbody, body)
rd-bodies(spec, cons(list(inpat,name,precond,postcond,bodnam), choicelist),
cons(cons(bodnam,genbody),rep-bodies), donelist, params,
rep-bodnams,env,
cons(list('function,name,inpat,params,precond,postcond,body), deflist),
more) ←
not-in(bodnam, donelist), member(bodnam, rep-bodnams, true),
write(bodnam), write("?"),
is-body(spec, genbody, more1, true, env, inpat),
spec-body(inpat, env, genbody, body).
function getb
(1 1 0)
getb(bodnam, cons(cons(bodnam,genbody), rep-bodies), genbody)
getb(bodnam, cons(x,repbodies), genbody) ←
getb(bodnam, repbodies, genbody).
function spec-body
(1 1 1 0)
spec-body(inpat, env, cons('bktrkcond, genalternatives),
cons('bktrkcond, alternatives) ) ←
spec-alts(inpat, env, genalternatives, alternatives).
function spec-alts
(1 1 1 0)
spec-alts(inpat, env, (), ())
spec-alts(inpat, env, cons(genmatch-try-pair, genalternatives),
cons(match-try-pair, alternatives)) ←
spec-clause(inpat, env, genmatch-try-pair, match-try-pair),
spec-alts(inpat, env, genalternatives, alternatives).
function spec-clause
(1 1 1 0)
spec-clause(inpat, env, list(arglist, cons('try,genlist)),
list(arglist, cons('try,sblist))) ←
mk-known(inpat, arglist, (), knownvars),
spec-goalist(genlist, env, knownvars, sblist).
function spec-goalist
(1 1 1 0)
spec-goalist((), env, knownvars, ())
spec-goalist(cons( cons(name,l), genlist), env, knownvars,
cons( cons(name,l),sblist)) ←
generic(name, env, undef),
mk-allknown(l, knownvars, newknownvars),
spec-goalist(genlist, env, newknownvars, sblist)
spec-goalist(cons(cons(genname,arglist), genlist), env, knownvars,
cons(cons(name,arglist), sblist)) ←
generic(genname, env, selections),
mk_pat(arglist, knownvars, inpat),
choose-fun(inpat, selections, name),
mk-allknown(arglist,knownvars, newknownvars),
spec-goalist(genlist, env, newkownvars, sblist).
function trans
(1 1 1 0)
trans(list( 'function, name, inpat, params, precond, postcond,
cons('bktrkcond, alternatives)), env, 'lisp,
list( 'defun, name, 'fexpr, '(l),
list( 'cond list( list('trueprecond,list('cons,
list('quote, name)
'l)),
list('bktrkcond, 'l, list('quote,
alternatives))),
'(t 'undef))) ).
.